package server.inscripcionOnLine;

import server.Control;
import server.actividades.ControlActividades;
import server.aula.ControlAula;
import utils.Utils;
import persistencia.dominio.*;
import persistencia.*;
import java.sql.*;
import java.util.*;

import comun.constantes.*;

public class ControlInscripcionOnLine extends Control{
	
	public ControlInscripcionOnLine() {}
	
	public ControlInscripcionOnLine(Persistencia persistencia) {
		this.persistencia = persistencia;
	}
	
	public ControlInscripcionOnLine(Persistencia persistencia,Connection conexion) {
		this.persistencia = persistencia;
		this.conexionSQL = conexion;
	}
	
	public ControlInscripcionOnLine(Connection conexion) {
		this.conexionSQL = conexion;
	}
	
	public String eliminarUsuario(Vector idsUsuarioAEliminar) throws Exception {
		Enumeration enum = idsUsuarioAEliminar.elements();
		while (enum.hasMoreElements()) {
			Long idPersona = (Long)enum.nextElement();
			Participante participante = (Participante)persistencia.getObjectoPorId("persistencia.dominio.Participante",idPersona);
			persistencia.deletePersistente(participante);
		}
		return comun.constantes.TEXTOS.ELIMINACION_DE_DATOS_EXITOSA;
	}
	
	public ResultSet getDetalledeAulas(Long idAulaViaWeb, String nombreAula) {
		String sql = "";
		ResultSet detalledeAulas = null;
		sql += "SELECT AULA.nombre as aula, AULA_COMPUESTA.informacion as informacion FROM AULA_COMPUESTA,AULA WHERE AULA_COMPUESTA.aula_compuesta_id=AULA.aula_compuesta_id AND AULA.id="+idAulaViaWeb+" GROUP BY AULA.nombre";
		detalledeAulas = this.ejecutarSQL(sql);
		return detalledeAulas;
	}
	
	public ResultSet getDetalledeAlumnosporAula(Long idAulaViaWeb, Long idPersona, Long idTipoUsuario, String nombreAula){
		String sql = "";
		ResultSet alumnoaula = null;
		sql += "SELECT distinct AULA.nombre as aula, PERSONA.PERSONA_ID as perso, PERSONA.id as id, PARTICIPANTE.FECHA_ALTA as fechaAlta, PERSONA.apellido as apellido, PERSONA.nombre as nombre, PERSONA.calle as domicilio, PERSONA.altura_calle as nro, PERSONA.fecha_nacimiento as fecha_nac, PERSONA.tipo_doc as tipo_doc, PERSONA.numero_doc as nro_doc, PERSONA.numero_celular as nro_celular, PERSONA.telefono as telefono, PERSONA.email as e_mail  FROM PARTICIPANTE,TIPO_USUARIO,PERSONA,AULA WHERE PARTICIPANTE.aula_id=AULA.aula_id  and PARTICIPANTE.persona_id= PERSONA.persona_id and AULA.id="+idAulaViaWeb+" and TIPO_USUARIO.TIPO_USUARIO_ID = PARTICIPANTE.TIPO_USUARIO_ID AND TIPO_USUARIO.NOMBRE = \""+TIPO_USUARIOS.ALUMNO+"\" order by PERSONA.apellido" ; // TIPO_USUARIO.tipo_usuario_id=\"70368744177665\" and
		alumnoaula = this.ejecutarSQL(sql);
		return alumnoaula;
	}

	public Long agregarParticipante(Long idAulaViaWeb, Long idPersona) throws Exception {
		AulaCompuesta aula = (AulaCompuesta)persistencia.getObjectoPorId("persistencia.dominio.Aula", idAulaViaWeb);
		Persona persona=(Persona)persistencia.getObjectoPorId("persistencia.dominio.Persona", idPersona);
		TipoUsuario tipousuario = (TipoUsuario)persistencia.getObjectosPorClaseYFiltro("persistencia.dominio.TipoUsuario","nombre==\""+TIPO_USUARIOS.ALUMNO+"\" ").elementAt(0);
		
		Participante participante = new Participante();
		participante.setAula(aula);
		participante.setPersona(persona);
		participante.setTipoUsuario(tipousuario);
		participante.setFechaAlta(utils.Utils.hoySqlDate());
		persistencia.hacerPersistente(participante);

		Aula organizacion = aula.getAulaCompuesta();
		ControlAula controlAula = new ControlAula(this.persistencia);
		Participante participanteOrganizacion = null;
		participanteOrganizacion =  controlAula.getParticipante(organizacion.getId(),persona.getId());
		if (participanteOrganizacion == null){
			participanteOrganizacion = new Participante();
			participanteOrganizacion.setAula(organizacion);
			participanteOrganizacion.setPersona(persona);
			participanteOrganizacion.setTipoUsuario(tipousuario);
			participanteOrganizacion.setFechaAlta(utils.Utils.hoySqlDate());
			persistencia.hacerPersistente(participanteOrganizacion);
		}
		
		// Si el aula tiene una sola comision, hay que asignarlo
		if (aula.getAulas().size() == 1){
			ParticipanteComision participanteComision = new ParticipanteComision();
			participanteComision.setParticipante(participante);
			participanteComision.setComision((Comision)aula.getAulas().toArray()[0]);
			persistencia.hacerPersistente(participanteComision);
			
			ControlActividades controlActividades = new ControlActividades(this.persistencia);
			controlActividades.crearNotasAParticipantesNuevosDelAula(idAulaViaWeb);
		}
		return participante.getId();
	}
	
	public Vector getAulasOrganizacionParaInscripcion(Long idOrganizacion) throws Exception {
		// poner nombreUsuario y password en la consulta
		String filtro =  "inscripcionOnline.estado == \""+ESTADO_INSCRIPCION_ONLINE.ACTIVA+"\""+
		" & aulaCompuesta.id == "+idOrganizacion;
		
		java.sql.Timestamp fechaHoy = Utils.hoySqlDate(); 
		String parametros = "java.sql.Timestamp fechaHoy";
		filtro += " & fechaHoy >= inscripcionOnline.fechaInicio & fechaHoy <= inscripcionOnline.fechaFin";
		 	
		
		filtro +=
			" & ( estadoAula.descripcion == \""+ESTADO_AULAS.EN_PREPARACION +"\" "+
			"    | estadoAula.descripcion == \""+ESTADO_AULAS.PRE_INSCRIPCION +"\" "+
			"    | estadoAula.descripcion == \""+ESTADO_AULAS.SELECCION +"\" "+
			"    | estadoAula.descripcion == \""+ESTADO_AULAS.ACTIVO +"\" )";

		
		Vector cursos = persistencia.getObjectosPorClase("persistencia.dominio.Curso","nombre",filtro,"",parametros,fechaHoy,null,null);
		//Vector cursos = persistencia.getObjectosPorClaseYFiltro("persistencia.dominio.Curso","nombre",filtro);
		//System.out.println("filtro: "+filtro+" #: "+cursos.size());
		return cursos;
	}
	
	public Vector alertaNuevoInscripto(Long idAula, Long idPersona) throws Exception {
		String filtroAcceso = "persona.id == "+idPersona;
		Vector accesos = persistencia.getObjectosPorClaseYFiltro("persistencia.dominio.AccesoPagina","fechaHoraEntrada descending",filtroAcceso);
		java.sql.Timestamp fechaUltAcc = null;
		//Nunca accedio o es la primera vez que lo hace; por lo tanto debe ver las actualizaciones hechas
		if(accesos.size()<=1) fechaUltAcc = Utils.hoySqlDate();
		else//Tiene mas de un acceso al SIAT, sacamos siempre el segundo mas actual
			fechaUltAcc = ((AccesoPagina)accesos.elementAt(1)).getFechaHoraEntrada();
		
		String parametros = "java.sql.Timestamp fechaUltAcc";
  		String filtroInscriptos = "fechaAlta >= fechaUltAcc";
  		filtroInscriptos += " & tipoUsuario.nombre == \""+ TIPO_USUARIOS.ALUMNO+"\"";
  		filtroInscriptos += "& aula.id == "+idAula;
  		Vector inscriptosNuevos = persistencia.getObjectosPorClase("persistencia.dominio.Participante",
  				     "",filtroInscriptos,"",parametros,fechaUltAcc,null,null);
  		return inscriptosNuevos;
	}
	
	public int alertaEventosProximosDias(Long idAula,Long idPersona,Integer dias){
	    try {
           Long idCalendario = null;
	       String parametros = "java.sql.Timestamp fechaHoy ,java.sql.Timestamp fechaNDiasDespues";
	       Timestamp fechaHoy = utils.Utils.comienzoDia(utils.Utils.hoySqlDate());
	       Timestamp fechaDiezNDiasDespues = new Timestamp(3600000*24*dias.intValue()+(new java.util.Date()).getTime());
	       String filtro=
	          " comunicacion.id == "+idCalendario;
	       filtro +=
	           " & fechaEvento >= fechaHoy & fechaEvento <= fechaNDiasDespues";

	      Vector textos = persistencia.getObjectosPorClase("persistencia.dominio.Texto"
	          ,"fechaEvento ascending",filtro,"", parametros,fechaHoy,fechaDiezNDiasDespues,null);

	      Texto eventoMasCercano = ((Texto)textos.elementAt(0));
	      Timestamp fechaPrimerEvento = utils.Utils.comienzoDia(eventoMasCercano.getFechaEvento());
	      int diferenciaDias =new  Float((fechaPrimerEvento.getTime()-fechaHoy.getTime())/(3600000*24)).intValue();
	      return diferenciaDias;
	    }
	    catch (Exception ex) {
	      ex.printStackTrace();
	      return -1;
	    }    
	  }
}